home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / Libraries / PNL Libraries / MyNewPreferences.p < prev    next >
Encoding:
Text File  |  1995-10-24  |  5.9 KB  |  223 lines  |  [TEXT/CWIE]

  1. unit MyNewPreferences;
  2.  
  3. interface
  4.  
  5.     uses
  6.         Files, MyCollections;
  7.  
  8.     var
  9.         the_prefs_folder_vrn: integer;
  10.         the_prefs_folder_dirID: longint;
  11.         prefs_fs: FSSPec;
  12.         prefs: collection;
  13.  
  14.     procedure InitNewPreferences(strhId, folderindex, fileindex: integer; fcreator: OSType);
  15.     procedure FinishPreferences;
  16.     procedure DeletePrefsFile;
  17.     function WritePrefsData: OSErr;
  18.     procedure ReadPrefsData;
  19.     procedure JustReadPrefsData;
  20.     procedure ReadPrefsCollection (c: collection; res_id: integer);
  21.     function WritePrefsCollection (c: collection; res_id: integer): OSErr;
  22.     function PutResource (hhhh: handle; typ: ResType; id: integer): OSErr; { handle remains unchanged, and is detatched }
  23.     procedure ReadPrefsHandle (var hhhh: handle; typ: ResType; id: integer);
  24.     function WritePrefsHandle (hhhh: handle; typ: ResType; id: integer): OSErr;
  25.     procedure SetDefaultLong (code: OSType; def: longint);
  26.  
  27. implementation
  28.  
  29.     uses
  30.         Resources, GestaltEqu, Folders, AppleTalk, Aliases, TextUtils, 
  31.         MyFileSystemUtils, MyFDFlags;
  32.  
  33.     const
  34.         prefs_restype = 'PRFN';
  35.         prefs_resid = 128;
  36.         prefs_type = 'pref';
  37.  
  38.     var
  39.         prefs_creator: OSType;
  40.         prefs_mdate: longint;
  41.         
  42.     procedure DeletePrefsFile;
  43.         var
  44.             junk: OSErr;
  45.     begin
  46.         junk := HDelete(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name);
  47.     end;
  48.  
  49.     procedure ReadPrefsHandle (var hhhh: handle; typ: ResType; id: integer);
  50.         var
  51.             resfile: integer;
  52.     begin
  53.         resfile := HOpenResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fsRdPerm);
  54.         hhhh := GetResource(typ, id);
  55.         if hhhh <> nil then begin
  56.             DetachResource(hhhh);
  57.         end;
  58.         if resfile <> -1 then begin
  59.             CloseResFile(resfile);
  60.         end;
  61.     end;
  62.  
  63.     procedure ReadPrefsCollection (c: collection; res_id: integer);
  64.         var
  65.             hhhh: handle;
  66.     begin
  67.         ReadPrefsHandle(hhhh, prefs_restype, res_id);
  68.         if hhhh <> nil then begin
  69.             HackUpdateHandleToCollection(hhhh);
  70.             c.SetDataHandle(hhhh);
  71.         end;
  72.     end;
  73.  
  74.     procedure JustReadPrefsData;
  75.     begin
  76.         ReadPrefsCollection(prefs, prefs_resid);
  77.         prefs.safeget := true;
  78.     end;
  79.  
  80.     function PutResource (hhhh: handle; typ: ResType; id: integer): OSErr;
  81.         var
  82.             err: OSErr;
  83.             old: handle;
  84.             xid: integer;
  85.             xtyp: ResType;
  86.             name: Str255;
  87.     begin
  88.         name := '';
  89.         old := Get1Resource(typ, id);
  90.         if old <> nil then begin
  91.             GetResInfo(old, xid, xtyp, name);
  92.             RemoveResource(old);
  93.             DisposeHandle(old);
  94.         end;
  95.         AddResource(hhhh, typ, id, name);
  96.         err := ResError;
  97.         if err = noErr then begin
  98.             WriteResource(hhhh);
  99.             err := ResError;
  100.             DetachResource(hhhh);
  101.         end;
  102.         PutResource := err;
  103.     end;
  104.  
  105.     function WritePrefsHandle (hhhh: handle; typ: ResType; id: integer): OSErr;
  106.         var
  107.             err, junk: OSErr;
  108.             resfile: integer;
  109.     begin
  110.         junk := HCreate(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, prefs_creator, prefs_type);
  111.         HCreateResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name);
  112.         resfile := HOpenResFile(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fsRdWrPerm);
  113.         err := ResError;
  114.         if resfile <> -1 then begin
  115.             err := PutResource(hhhh, typ, id);
  116.             CloseResFile(resfile);
  117.             junk := FlushVol(nil, prefs_fs.vRefNum);
  118.         end;
  119.         WritePrefsHandle := err;
  120.     end;
  121.  
  122.     function WritePrefsCollection (c: collection; res_id: integer): OSErr;
  123.         var
  124.             hhhh: handle;
  125.     begin
  126.         hhhh := c.GetDataHandle;
  127.         WritePrefsCollection := WritePrefsHandle(hhhh, prefs_restype, res_id);
  128.     end;
  129.  
  130.     function WritePrefsData: OSErr;
  131.     begin
  132.         WritePrefsData := WritePrefsCollection(prefs, prefs_resid);
  133.     end;
  134.  
  135.     procedure ReadPrefsData;
  136.         var
  137.             nmoddate: longint;
  138.     begin
  139.         MyGetModDate(prefs_fs, nmoddate);
  140.         if nmoddate <> prefs_mdate then begin
  141.             prefs_mdate := nmoddate;
  142.             JustReadPrefsData;
  143.         end;
  144.     end;
  145.  
  146.     procedure FixPrefType;
  147.         var
  148.             fi: FInfo;
  149.             err: OSErr;
  150.     begin
  151.         err := HGetFInfo(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fi);
  152.         if (err = noErr) & (fi.fdCreator = prefs_creator) & (fi.fdType <> prefs_type) then begin
  153.             fi.fdType := prefs_type;
  154.             fi.fdFlags := BAND(fi.fdFlags, BNOT(fdInited));
  155.             err := HSetFInfo(prefs_fs.vRefNum, prefs_fs.parID, prefs_fs.name, fi);
  156.         end;
  157.     end;
  158.  
  159.     procedure SetDefaultLong (code: OSType; def: longint);
  160.     begin
  161.         if not prefs.ExistsTag(code) then begin
  162.             prefs.SetTagLong(code, def);
  163.         end;
  164.     end;
  165.     
  166.     procedure InitNewPreferences(strhId, folderindex, fileindex: integer; fcreator: OSType);
  167.         var
  168.             gv: longint;
  169.             oe: OSErr;
  170.             pb: CInfoPBRec;
  171.             sysenv: SysEnvRec;
  172.             name: Str255;
  173.             dummy: longint;
  174.             our_prefs_folder_vrn: integer;
  175.             our_prefs_folder_dirID: longint;
  176.     begin
  177.         prefs_creator := fcreator;
  178.         new(prefs);
  179.         prefs.Create(0, false, true);
  180.         prefs.safeget := true;
  181.  
  182. { First Find the Preferences Folder }
  183.         if (Gestalt(gestaltFindFolderAttr, gv) <> noErr) | (not BTST(gv, gestaltFindFolderPresent)) | (FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder, the_prefs_folder_vrn, the_prefs_folder_dirID) <> NoErr) then begin
  184.             oe := SysEnvirons(1, sysenv);
  185.             the_prefs_folder_vrn := sysenv.sysVRefNum;
  186.             the_prefs_folder_dirID := 0;
  187.             name := 'Preferences';
  188.             oe := DirCreate(the_prefs_folder_vrn, the_prefs_folder_dirID, name, dummy);
  189.             oe := MyGetCatInfo(the_prefs_folder_vrn, the_prefs_folder_dirID, name, 0, pb);
  190.             if (oe = noErr) & (BAND(pb.ioFlAttrib, $10) <> 0) then begin
  191.                 the_prefs_folder_vrn := pb.ioVRefNum;
  192.                 the_prefs_folder_dirID := pb.ioDirID;
  193.             end;
  194.         end;
  195.  
  196. { Then our folder, if any }
  197.         our_prefs_folder_vrn := the_prefs_folder_vrn;
  198.         our_prefs_folder_dirID := the_prefs_folder_dirID;
  199.         if folderindex > 0 then begin
  200.             GetIndString(name, strhId, folderindex);
  201.             oe := DirCreate(our_prefs_folder_vrn, our_prefs_folder_dirID, name, dummy);
  202.             oe := MyGetCatInfo(our_prefs_folder_vrn, our_prefs_folder_dirID, name, 0, pb);
  203.             if (oe = noErr) & (BAND(pb.ioFlAttrib, $10) <> 0) then begin
  204.                 our_prefs_folder_vrn := pb.ioVRefNum;
  205.                 our_prefs_folder_dirID := pb.ioDirID;
  206.             end;
  207.         end;
  208.  
  209.         GetIndString(name, strhId, fileindex);
  210.         oe := MyFSMakeFSSpec(our_prefs_folder_vrn, our_prefs_folder_dirID, name, prefs_fs);
  211.  
  212.         FixPrefType;
  213.  
  214.         MyGetModDate(prefs_fs, prefs_mdate);
  215.         JustReadPrefsData;
  216.     end;
  217.  
  218.     procedure FinishPreferences;
  219.     begin
  220.         prefs.Destroy;
  221.     end;
  222.     
  223. end.